package cn.xuqiudong.demo.ocr;

import net.sourceforge.tess4j.ITessAPI;
import net.sourceforge.tess4j.Tesseract;

import java.io.File;

/**
 * 描述:
 *
 * @author Vic.xu
 * @since 2025-04-01 10:29
 */
public class SimpleOCRTest {

    static Tesseract tesseract = new Tesseract();

    static {
        // 2. 设置路径
        tesseract.setDatapath("C:/Program Files/Tesseract-OCR/tessdata");
        // 3. 设置语言
//        tesseract.setLanguage("chi_sim");
//        tesseract.setLanguage("eng");
        // 中英混合识别
        tesseract.setLanguage("chi_sim+eng");

        // 提高识别精度（示例参数）
        // 自动页面分割
//        tesseract.setPageSegMode(ITessAPI.TessPageSegMode.PSM_AUTO);
        // 使用LSTM引擎
        tesseract.setOcrEngineMode(ITessAPI.TessOcrEngineMode.OEM_LSTM_ONLY);

        /*
        (2) 针对性优化
            发票特征	对应参数配置
            密集表格	tesseract.setPageSegMode(PSM_AUTO_OSD); （带布局分析）
            模糊文字	tesseract.setTessVariable("tessedit_pageseg_mode", "6"); （强制块模式）
            数字/金额	tesseract.setTessVariable("tessedit_char_whitelist", "0123456789.,¥$");
         */
//        tesseract.setVariable("preserve_interword_spaces", "1");  // 保留空格
        tesseract.setVariable("tessedit_pageseg_mode", "6"); //（强制块模式）
//        tesseract.setVariable("tessedit_char_whitelist", "0123456789.,¥$");

    }
    public static void main(String[] args) {
        String relativePath = "static/imgs/invoice/3.png";
//        relativePath = "static/imgs/invoice/4.pdf";
        test(relativePath);
    }

    public static void test(String relativePath) {
        try {
            //   识别图片
            File imageFile = getFile(relativePath);
            String result = tesseract.doOCR(imageFile);
            //   输出结果
            System.out.println("识别结果：\n" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static File getFile(String relativePath) {
        File file = new File(SimpleOCRTest.class.getClassLoader().getResource(relativePath).getPath());
        if (!file.exists()) {
            throw new RuntimeException(relativePath + " 文件不存在");
        }
        return file;
    }
}
